import router from './router'
import { useAppStoreWithOut } from '@/store/modules/app'
import type { RouteRecordRaw } from 'vue-router'
import { useTitle } from '@/hooks/web/useTitle'
import { useNProgress } from '@/hooks/web/useNProgress'
import { usePermissionStoreWithOut } from '@/store/modules/permission'
import { usePageLoading } from '@/hooks/web/usePageLoading'
import { NO_REDIRECT_WHITE_LIST } from '@/constants'
import { useUserStoreWithOut } from '@/store/modules/user'

const { start, done } = useNProgress()

const { loadStart, loadDone } = usePageLoading()

// 验证路由对象是否有效的辅助方法
const isValidRoute = (route: any): boolean => {
  if (!route || typeof route !== 'object') {
    console.warn('权限控制：路由对象无效:', route)
    return false
  }

  // 检查必要的属性
  if (!route.path || typeof route.path !== 'string') {
    console.warn('权限控制：路由缺少path属性:', route)
    return false
  }

  // 检查path是否为空字符串
  if (route.path.trim() === '') {
    console.warn('权限控制：路由path为空字符串:', route)
    return false
  }

  // 确保children属性是数组
  if (route.children && !Array.isArray(route.children)) {
    console.warn('权限控制：路由的children属性不是数组:', route)
    return false
  }

  // 确保meta属性是对象
  if (route.meta && typeof route.meta !== 'object') {
    console.warn('权限控制：路由的meta属性不是对象:', route)
    return false
  }

  // 检查component属性：如果有子路由，允许component为空（会使用Layout）
  // 对于特殊路由（如404、重定向等），也允许component为空
  if (!route.component && (!route.children || route.children.length === 0)) {
    // 检查是否是特殊路由
    const isSpecialRoute =
      route.path === '/:path(.*)*' || route.path === '/404' || route.path === '/redirect'
    if (!isSpecialRoute) {
      console.warn('权限控制：路由缺少component属性且无子路由:', route)
      return false
    } else {
      console.log('权限控制：特殊路由，允许component为空:', route.path)
    }
  }

  console.log('权限控制：路由验证通过:', route)
  return true
}

router.beforeEach(async (to, from, next) => {
  try {
    start()
    loadStart()

    console.log('权限控制：路由守卫开始，目标路径:', to.path)

    const permissionStore = usePermissionStoreWithOut()
    const appStore = useAppStoreWithOut()
    const userStore = useUserStoreWithOut()

    // 检查用户信息
    if (userStore.getUserInfo) {
      console.log('权限控制：用户已登录')

      if (to.path === '/login') {
        console.log('权限控制：用户已登录，重定向到首页')
        next({ path: '/' })
        return
      }

      // 检查路由是否已经添加
      if (permissionStore.getIsAddRouters) {
        console.log('权限控制：路由已添加，直接通过')
        next()
        return
      }

      console.log('权限控制：开始生成路由...')

      // 使用静态路由
      console.log('权限控制：使用静态路由')
      await permissionStore.generateRoutes()

      // 检查是否有生成的路由
      console.log('权限控制：开始检查路由')
      console.log('权限控制：permissionStore.getAddRouters:', permissionStore.getAddRouters)

      const addRouters = permissionStore.getAddRouters || []
      console.log('权限控制：解析后的addRouters:', addRouters)
      console.log('权限控制：addRouters类型:', typeof addRouters, '长度:', addRouters?.length)

      if (addRouters && Array.isArray(addRouters) && addRouters.length > 0) {
        // 验证路由对象
        const validRoutes = addRouters.filter((route) => isValidRoute(route))
        console.log('权限控制：有效路由数量:', validRoutes.length)

        if (validRoutes.length > 0) {
          console.log('权限控制：开始添加路由，数量:', validRoutes.length)
          validRoutes.forEach((route, index) => {
            if (route) {
              console.log(`权限控制：添加路由 ${index}:`, route)
              router.addRoute(route as unknown as RouteRecordRaw) // 动态添加可访问路由表
            } else {
              console.warn(`权限控制：路由 ${index} 为空，跳过`)
            }
          })

          permissionStore.setIsAddRouters(true)
          console.log('权限控制：路由添加完成，准备跳转到目标路径:', to.path)

          // 路由添加完成后，直接跳转到目标路径
          // 使用replace: true确保路由历史记录正确
          next({ ...to, replace: true })
        } else {
          console.warn('权限控制：没有有效路由，跳转到首页')
          permissionStore.setIsAddRouters(true)
          next({ path: '/' })
        }
      } else {
        // 如果没有生成任何路由，跳转到首页
        console.warn('权限控制：没有生成任何路由，跳转到首页')
        permissionStore.setIsAddRouters(true)
        next({ path: '/' })
      }
    } else {
      console.log('权限控制：用户未登录')
      if (NO_REDIRECT_WHITE_LIST.indexOf(to.path) !== -1) {
        console.log('权限控制：白名单路径，直接通过')
        next()
      } else {
        console.log('权限控制：重定向到登录页')
        next(`/login?redirect=${to.path}`) // 否则全部重定向到登录页
      }
    }
  } catch (error) {
    console.error('权限控制：路由守卫出错:', error)
    // 如果路由守卫出错，尝试跳转到首页
    try {
      next({ path: '/' })
    } catch (fallbackError) {
      console.error('权限控制：回退跳转也失败:', fallbackError)
      // 最后的回退方案：跳转到登录页
      next('/login')
    }
  }
})

router.afterEach((to) => {
  useTitle(to?.meta?.title as string)
  done() // 结束Progress
  loadDone()
})
